home *** CD-ROM | disk | FTP | other *** search
/ Aminet 12 / Aminet 12 (1996)(GTI - Schatztruhe)[!][Jun 1996].iso / Aminet / gfx / misc / SafeClip.lha / SafeClip / SASC / clip.s < prev    next >
Text File  |  1996-03-29  |  8KB  |  359 lines

  1. *
  2. * Name:        clip.s 
  3. * Description: Routines for clipping line segments and filled polygons
  4. * Author:      pak@star.sr.bham.ac.uk (Peter Knight)
  5. * Notes:       Requires 68020+
  6. *
  7.  
  8.     xdef _lineclip
  9.         xdef _clip2d    
  10.  
  11.     xref _CLP_xmin
  12.     xref _CLP_ymin
  13.     xref _CLP_xmax
  14.     xref _CLP_ymax
  15.  
  16.     SECTION CLIP,CODE
  17.  
  18. * Clip to x boundary
  19. CLIPX MACRO
  20.         movem.l (a0),d2-d5              * get (x1,y1) and (x2,y2)
  21.         sub.l   d2,d4                   * x2-x1
  22.         sub.l   d3,d5                   * y2-y1
  23.         sub.l   d6,d2                   * x1-xint
  24.         muls.l  d2,d7:d5
  25.         divs.l  d4,d7:d5
  26.         sub.l   d5,d3                   * y intercept
  27.         move.l  d6,(a1)+                * save x intercept
  28.         move.l  d3,(a1)+                * save y intercept
  29.     ENDM
  30.  
  31. * Clip to y boundary
  32. CLIPY MACRO
  33.         movem.l (a0),d2-d5              * get (x1,y1) and (x2,y2)
  34.         sub.l   d2,d4                   * x2-x1
  35.         sub.l   d3,d5                   * y2-y1
  36.         sub.l   d6,d3                   * y1-xint
  37.         muls.l  d3,d7:d4
  38.         divs.l  d5,d7:d4
  39.         sub.l   d4,d2                   * x intercept
  40.         move.l  d2,(a1)+                * save x intercept
  41.         move.l  d6,(a1)+                * save y intercept
  42.     ENDM
  43.  
  44. *                
  45. * lineclip - Clip line segment to viewport
  46. *
  47. * on entry:
  48. * a0.l - address of vertices.
  49. *
  50. * on exit:
  51. * d0.l - TRUE if some part of line drawn, else FALSE
  52. * all other registers preserved
  53. *
  54. _lineclip:
  55.         movem.l d1-d7/a0-a5,-(sp)       * Save registers.
  56.  
  57. * Bad return code
  58.     moveq    #0,d0
  59.  
  60. * Duplicate first end point
  61.     move.l    (a0),16(a0)
  62.     move.l    4(a0),20(a0) 
  63.  
  64. * Clip against xmin
  65.     move.l    _CLP_xmin,d6
  66.     cmp.l    (a0),d6
  67.     ble.s   ok1
  68.     cmp.l    8(a0),d6
  69.     bgt    quit
  70.     move.l    a0,a1
  71.     CLIPX
  72.     bra.s    ok2
  73. ok1:
  74.     cmp.l    8(a0),d6
  75.     ble.s    ok2
  76.     lea    8(a0),a1
  77.     CLIPX
  78.  
  79. * Clip against xmax
  80. ok2:
  81.     move.l    _CLP_xmax,d6
  82.     cmp.l    (a0),d6
  83.     bge.s    ok3
  84.     cmp.l    8(a0),d6
  85.     blt    quit
  86.     move.l    a0,a1
  87.     CLIPX
  88.     bra.s    ok4
  89. ok3:
  90.     cmp.l    8(a0),d6
  91.     bge.s    ok4
  92.     lea    8(a0),a1
  93.     CLIPX
  94.  
  95. * Clip against ymin
  96. ok4:
  97.     move.l    _CLP_ymin,d6
  98.     cmp.l    4(a0),d6
  99.     ble.s    ok5
  100.     cmp.l    12(a0),d6
  101.     bgt    quit
  102.     move.l    a0,a1
  103.     CLIPY
  104.     bra.s    ok6
  105. ok5:
  106.     cmp.l    12(a0),d6
  107.     ble.s    ok6
  108.     lea    8(a0),a1
  109.     CLIPY
  110.  
  111. * Clip against ymax
  112. ok6:
  113.     move.l    _CLP_ymax,d6
  114.     cmp.l    4(a0),d6
  115.     bge.s    ok7
  116.     cmp.l    12(a0),d6
  117.     blt    quit
  118.     move.l    a0,a1
  119.     CLIPY
  120.     bra.s    ok8
  121. ok7:
  122.     cmp.l    12(a0),d6
  123.     bge.s    ok8
  124.     lea    8(a0),a1
  125.     CLIPY
  126. ok8:
  127.     moveq    #1,d0
  128. quit:
  129.         movem.l (sp)+,d1-d7/a0-a5
  130.         rts
  131.  
  132.  
  133. *                
  134. * clip2d - Clip 2-d polygon to viewport
  135. *
  136. * on entry:
  137. * d0.w - number of vertices
  138. * a0.l - address of vertices.
  139. * a1.l - address of draw buffer.
  140. *
  141. * on exit:
  142. * d0.w - number of vertices in clipped polygon
  143. * all other registers preserved
  144. *
  145. _clip2d:
  146.         movem.l d1-d7/a0-a5,-(sp)       * Save registers.
  147.  
  148. * Save address of draw buffer.
  149.     move.l    a0,a5
  150.         move.l  a1,a4
  151.     exg    d0,d1
  152.         
  153. * Clip against xmin.
  154.         subq.w  #2,d1
  155.         move.w  d1,d0                   * d0 is from count
  156.         move.l    a5,a0                   * from buffer
  157.         move.l    a4,a1                   * to buffer is a1
  158.         moveq   #0,d1                   * d1 is to count
  159.         move.l  _CLP_xmin,d6            * d6 is XMIN.
  160.         cmp.l   (a0),d6
  161.         bge.s   xmin_loop
  162.         move.l  (a0),(a1)+
  163.         addq.w  #1,d1
  164.         move.l  4(a0),(a1)+
  165. xmin_loop:
  166.         cmp.l   (a0),d6
  167.         blt.s   xmin_over
  168.         cmp.l   8(a0),d6
  169.         bge.s   xmin_skip
  170.     CLIPX
  171.     addq.w    #1,d1
  172.         bra.s   xmin_next
  173. xmin_over:
  174.         cmp.l   8(a0),d6
  175.         blt.s   xmin_next
  176.     CLIPX
  177.     addq.w    #1,d1
  178.         bra.s   xmin_skip
  179. xmin_next:
  180.         lea     8(a0),a2
  181.         move.l  (a2)+,(a1)+
  182.         addq.w  #1,d1
  183.         move.l  (a2)+,(a1)+
  184. xmin_skip:
  185.         lea     8(a0),a0
  186.         dbra    d0,xmin_loop
  187.         tst.w   d1
  188.         beq     exit 
  189.     move.l    a4,a0
  190.         move.l  (a0)+,d5
  191.         move.l  (a0)+,d6
  192.         lea     -8(a1),a2
  193.         cmp.l   (a2)+,d5
  194.         bne.s   xmin_close
  195.         cmp.l   (a2)+,d6
  196.         beq.s   clipxmax
  197. xmin_close:
  198.         move.l  d5,(a1)+
  199.         addq.w  #1,d1
  200.         move.l  d6,(a1)+ 
  201.         
  202. * Clip against xmax.
  203. clipxmax:
  204.         subq.w  #2,d1
  205.         move.w  d1,d0                   * d0 is from count
  206.         move.l    a4,a0                   * from buffer
  207.         move.l    a5,a1                   * to buffer is a1
  208.         moveq   #0,d1                   * d1 is to count
  209.         move.l  _CLP_xmax,d6            * d6 is xmax
  210.         cmp.l   (a0),d6
  211.         blt.s   xmax_loop
  212.         move.l  (a0),(a1)+
  213.         addq.w  #1,d1
  214.         move.l  4(a0),(a1)+
  215. xmax_loop:
  216.         cmp.l   (a0),d6
  217.         bge.s   xmax_over
  218.         cmp.l   8(a0),d6
  219.         blt.s   xmax_skip
  220.     CLIPX
  221.     addq.w    #1,d1
  222.         bra.s   xmax_next
  223. xmax_over:
  224.         cmp.l   8(a0),d6
  225.         bge.s   xmax_next
  226.     CLIPX
  227.     addq.w    #1,d1
  228.         bra.s   xmax_skip
  229. xmax_next:
  230.         lea     8(a0),a2
  231.         move.l  (a2)+,(a1)+
  232.         addq.w  #1,d1
  233.         move.l  (a2)+,(a1)+
  234. xmax_skip:
  235.         lea     8(a0),a0
  236.         dbra    d0,xmax_loop
  237.         tst.w   d1
  238.         beq     exit    
  239.     move.l    a5,a0
  240.         move.l  (a0)+,d5
  241.         move.l  (a0)+,d6
  242.         lea     -8(a1),a2
  243.         cmp.l   (a2)+,d5
  244.         bne.s   xmax_close
  245.         cmp.l   (a2)+,d6
  246.         beq.s   clipymin
  247. xmax_close:
  248.         move.l  d5,(a1)+
  249.         addq.w  #1,d1
  250.         move.l  d6,(a1)+
  251.         
  252. * Clip against ymin.
  253. clipymin:
  254.         subq.w  #2,d1
  255.         move.w  d1,d0                   * d0 is from count
  256.         move.l    a5,a0                   * from buffer
  257.         move.l    a4,a1                   * to buffer is a1
  258.         moveq   #0,d1                   * d1 is to count
  259.         move.l  _CLP_ymin,d6            * d6 is ymin
  260.     cmp.l   4(a0),d6
  261.         bge.s   ymin_loop
  262.         move.l  (a0),(a1)+
  263.         addq.w  #1,d1
  264.         move.l  4(a0),(a1)+
  265. ymin_loop:
  266.         cmp.l   4(a0),d6
  267.         blt.s   ymin_over
  268.         cmp.l   12(a0),d6
  269.         bge.s   ymin_skip
  270.     CLIPY
  271.     addq.w    #1,d1
  272.         bra.s   ymin_next
  273. ymin_over:
  274.         cmp.l   12(a0),d6
  275.         blt.s   ymin_next
  276.     CLIPY
  277.     addq.w    #1,d1
  278.         bra.s   ymin_skip
  279. ymin_next:
  280.         lea     8(a0),a2
  281.         move.l  (a2)+,(a1)+
  282.         addq.w  #1,d1
  283.         move.l  (a2)+,(a1)+
  284. ymin_skip:
  285.         lea     8(a0),a0
  286.         dbra    d0,ymin_loop
  287.         tst.w   d1
  288.         beq     exit
  289.     move.l    a4,a0
  290.         move.l  (a0)+,d5
  291.         move.l  (a0)+,d6
  292.         lea     -8(a1),a2
  293.         cmp.l   (a2)+,d5
  294.         bne.s   ymin_close
  295.         cmp.l   (a2)+,d6
  296.         beq.s   clipymax
  297. ymin_close:
  298.         move.l  d5,(a1)+
  299.         addq.w  #1,d1
  300.         move.l  d6,(a1)+
  301.         
  302. * Clip against ymax.
  303. clipymax:
  304.         subq.w  #2,d1
  305.         move.w  d1,d0                   * d0 is from count
  306.         move.l  a4,a0                   * from buffer
  307.         move.l  a5,a1                   * to buffer is a1
  308.         moveq   #0,d1                   * d1 is to count
  309.         move.l  _CLP_ymax,d6            * d6 is ymax
  310.         cmp.l   4(a0),d6
  311.         blt.s   ymax_loop
  312.         move.l  (a0),(a1)+
  313.         addq.w  #1,d1
  314.         move.l  4(a0),(a1)+
  315. ymax_loop:
  316.         cmp.l   4(a0),d6
  317.         bge.s   ymax_over
  318.         cmp.l   12(a0),d6
  319.         blt.s   ymax_skip
  320.     CLIPY
  321.     addq.w    #1,d1
  322.         bra.s   ymax_next
  323. ymax_over:
  324.         cmp.l   12(a0),d6
  325.         bge.s   ymax_next
  326.     CLIPY
  327.     addq.w    #1,d1
  328.         bra.s   ymax_skip
  329. ymax_next:
  330.         lea     8(a0),a2
  331.         move.l  (a2)+,(a1)+
  332.         addq.w  #1,d1
  333.         move.l  (a2)+,(a1)+
  334. ymax_skip:
  335.         lea     8(a0),a0
  336.         dbra    d0,ymax_loop
  337.         tst.w   d1
  338.         beq.s   exit
  339.         move.l    a5,a0
  340.         move.l  (a0)+,d5
  341.         move.l  (a0)+,d6
  342.         lea     -8(a1),a2
  343.         cmp.l   (a2)+,d5
  344.         bne.s   ymax_close
  345.         cmp.l   (a2)+,d6
  346.         beq.s   exit
  347. ymax_close:
  348.         move.l  d5,(a1)+
  349.         addq.w  #1,d1
  350.         move.l  d6,(a1)+
  351.         
  352. * Restore registers and exit.
  353. exit:
  354.     move.l    d1,d0
  355.         movem.l (sp)+,d1-d7/a0-a5
  356.         rts
  357.  
  358.     END
  359.